package controle;
import java.util.Vector;

import negocio.Aluno;
import negocio.Curso;
import negocio.Disciplina;
import negocio.Pessoa;
import negocio.Professor;

import dados.*;
import excecoes.*;

public class Controlador {
	
	private IRepositorioPessoas repositorioPessoas = new RepositorioPessoaBD();
	private IRepositorioDisciplinas repositorioDisciplinas = new RepositorioDisciplinas();
	private IRepositorioCurso repositorioCurso = new RepositorioCurso();
	public void alterarDisciplina(Disciplina d)
			throws DisciplinaNaoCadastradaException {
		repositorioDisciplinas.alterarDisciplina(d);
	}
	
	public Disciplina consultaDisciplinaPorCodigo(int cod)
			throws DisciplinaNaoCadastradaException {
		return repositorioDisciplinas.consultaDisciplinaPorCodigo(cod);
	}
	
	public Vector<Disciplina> consultarDisciplinaPorNome(String nome) {
		return repositorioDisciplinas.consultarDisciplinaPorNome(nome);
	}
	
	public void inserirDisciplina(Disciplina d)
			throws DisciplinaComMesmoNomeException {
		repositorioDisciplinas.inserirDisciplina(d);
	}
	
	public Vector<Disciplina> PesquisarPorProfessor(Disciplina d) {
		return repositorioDisciplinas.PesquisarPorProfessor(d);
	}
	
	public void removerDisciplina(Disciplina d)
			throws DisciplinaNaoCadastradaException {
		repositorioDisciplinas.removerDisciplina(d);
	}
	
	public void alterarPessoa(Pessoa p) throws PessoaNaoCadastradaException {
		repositorioPessoas.alterarPessoa(p);
	}
	
	public Pessoa consultarPessoaPorMatricula(int mat)
			throws PessoaNaoCadastradaException {
		
		try {
			return repositorioPessoas.consultarPessoaPorMatricula(mat);
		} catch (PessoaNaoCadastradaException e) {
			throw new PessoaNaoCadastradaException();
		}		
	}
	
	public Vector<Pessoa> consultarPessoaPorNome(String nome) {
		return repositorioPessoas.consultarPessoaPorNome(nome);
	}
	
	public void inserirPessoa(Pessoa p) throws PessoaComMesmaMatriculaException, ErroSelecaoTipoPessoaException {
				
		if(!repositorioPessoas.consultarPessoa(p)){
			if(p instanceof Aluno){
				p.setTipo(Pessoa.TipoPessoa.ALUNO);
				Aluno a = (Aluno)p;
				repositorioPessoas.inserirPessoa(a);
			}else{
				if(p instanceof Professor){
					p.setTipo(Pessoa.TipoPessoa.PROFESSOR);
					Professor pf = (Professor)p;
					repositorioPessoas.inserirPessoa(pf);
				}else{
					throw new ErroSelecaoTipoPessoaException();
				}
			}
		}
		else{
			throw new PessoaComMesmaMatriculaException();
		}		
	}
	
	public Vector<Professor> listarProfessores() {
		return repositorioPessoas.listarProfessores();
	}
	
	public void removerPessoa(Pessoa p) throws PessoaNaoCadastradaException {
		repositorioPessoas.removerPessoa(p);
	}
	
	public boolean consultarPessoa(Pessoa p) {
		return repositorioPessoas.consultarPessoa(p);
	}
	
	public Vector<Aluno> listarAlunos() {
		return repositorioPessoas.listarAlunos();
	}
	
	public Vector<Pessoa> listarPessoas(String sql) {
		return repositorioPessoas.listarPessoas(sql);
	}
	
	public void alterarCurso(Curso c) throws CursoNaoCadastradoException{
		repositorioCurso.alterarCurso(c);
	}
	
	public Curso consultarCursoPorCodigo(int cod)
	throws CursoNaoCadastradoException {
		return repositorioCurso.consultarCursoPorCodigo(cod);		
	}
	
	public void deletarCurso(Curso c) {
		repositorioCurso.deletarCurso(c);
	}
	
	public void inserirCurso(Curso c) {
		repositorioCurso.inserirCurso(c);
	}
	
	public Vector<Curso> listarCurso() {
		return repositorioCurso.listarCurso();
	}
	


	
		
}
